static bool accept ( Dataset d, BTS** solution ) {
  uint incomes = 0; uint subscribers = 0; uint i = 0;
  while ( solution[i] != NULL ) {
    subscribers += solution[i]->subscribers;
    incomes += solution[i++]->incomes;
  }

  if ( subscribers <= d.capacity 
      && overEstimate ( d, solution ) >= maxIncome ) {
    if ( incomes >= maxIncome ) {
      memcpy ( BestSolution, solution, d.numberOfBTS * sizeof(BTS*));
      maxIncome = incomes;
    }
    return true;
  }

  return false;
}

/** 
 * Algorithme de Backtracking dont la fonction accept à 
 * été modifiée afin de vérifier que le sous-arbre est prometteur
 *
 * @param d Le jeux de données.
 * @param subscribers Le nombre courant d'abonnés.
 * @param recLevel Niveau de récursion.
 * @param startStation Station à partir de laquelle la recherche doit continuer.
 * @param solution Solution courante à compléter (éventuellement).
 */
void branchAndBound ( 
    Dataset d,
    uint subscribers,
    uint recLevel,
    uint startStation,
    BTS** solution ) {

  if ( !accept ( d, solution ) ) {
    solution [recLevel - 1] = NULL;
    return ;
  }

  for ( uint i = startStation; i < d.numberOfBTS; ++i ) {
    solution[recLevel] = d.stations + i;
    branchAndBound ( d, subscribers + d.stations[i].subscribers, 
        recLevel + 1, i + 1, solution );
  }

  if (recLevel != 0 ) solution [recLevel - 1] = NULL;
}
